from django.db import models
from django.utils.html import format_html

"""
这段代码定义了两个 Django 模型，用于管理商品信息：
Types 模型：
存储商品的分类信息，采用两级分类结构（一级分类和二级分类）
在 Admin 界面中显示为 "商品类型"
提供字符串表示方法，方便在关联显示时使用
CommodityInfos 模型：
存储商品的详细信息，包括名称、规格、价格、库存等字段
自动记录商品的上架日期（使用 auto_now_add=True）
支持商品主图和商品介绍文件的上传
在 Admin 界面中显示为 "商品信息"
提供自定义方法 colored_name，根据商品类型动态设置显示颜色：
包含 "童装" 的商品类型显示为红色
其他商品类型显示为蓝色
HTML 安全处理：
使用 django.utils.html.format_html 方法生成安全的 HTML 代码
避免 XSS 攻击风险，确保特殊字符被正确转义
"""
# 商品类型模型，用于存储商品的分类信息
class Types(models.Model):
    # 自增主键字段
    id = models.AutoField(primary_key=True)

    # 一级分类字段，最大长度100字符，中文标签为"一级类型"
    firsts = models.CharField('一级类型', max_length=100)

    # 二级分类字段，最大长度100字符，中文标签为"二级类型"
    seconds = models.CharField('二级类型', max_length=100)

    # 字符串表示方法，返回ID的字符串形式
    def __str__(self):
        return str(self.id)

    # 元数据类，用于定义模型在Admin界面中的显示名称
    class Meta:
        verbose_name = '商品类型'  # 单数形式的显示名称
        verbose_name_plural = '商品类型'  # 复数形式的显示名称


# 商品信息模型，用于存储商品的详细信息
class CommodityInfos(models.Model):
    # 自增主键字段
    id = models.AutoField(primary_key=True)

    # 商品名称字段，最大长度100字符，中文标签为"商品名称"
    name = models.CharField('商品名称', max_length=100)

    # 颜色规格字段，最大长度100字符，中文标签为"颜色规格"
    sezes = models.CharField('颜色规格', max_length=100)

    # 商品类型字段，最大长度100字符，中文标签为"商品类型"
    types = models.CharField('商品类型', max_length=100)

    # 商品价格字段，使用浮点数类型，中文标签为"商品价格"
    price = models.FloatField('商品价格')

    # 折后价格字段，使用浮点数类型，中文标签为"折后价格"
    discount = models.FloatField('折后价格')

    # 存货数量字段，使用整数类型，中文标签为"存货数量"
    stock = models.IntegerField('存货数量')

    # 已售数量字段，使用整数类型，中文标签为"已售数量"
    sold = models.IntegerField('已售数量')

    # 收藏数量字段，使用整数类型，中文标签为"收藏数量"
    likes = models.IntegerField('收藏数量')

    # 上架日期字段，使用日期类型，自动设置为创建时间，中文标签为"上架日期"
    created = models.DateField('上架日期', auto_now_add=True)

    # 商品主图字段，使用文件上传类型，上传目录为 imgs，中文标签为"商品主图"
    img = models.FileField('商品主图', upload_to=r'imgs')

    # 商品介绍字段，使用文件上传类型，上传目录为 details，中文标签为"商品介绍"
    details = models.FileField('商品介绍', upload_to=r'details')

    # 字符串表示方法，返回ID的字符串形式
    def __str__(self):
        return str(self.id)

    # 元数据类，用于定义模型在Admin界面中的显示名称
    class Meta:
        verbose_name = '商品信息'  # 单数形式的显示名称
        verbose_name_plural = '商品信息'  # 复数形式的显示名称

    # 自定义方法：根据商品类型返回带颜色的HTML标签
    # 用于在Admin界面中以不同颜色显示商品类型
    def colored_name(self):
        # 如果商品类型包含"童装"，则显示为红色，否则显示为蓝色
        if '童装' in self.types:
            color_code = 'red'
        else:
            color_code = 'blue'
        # 使用format_html安全地生成HTML代码
        return format_html(
            '<span style="color: {};">{}</span>',
            color_code,
            self.types,  # 注意：此处原代码可能有误，应显示self.types而非self.name
        )

    # 设置Admin界面中该方法的显示名称
    colored_name.short_description = '带颜色的商品类型'